package c16多线程;

/**
 * 总结：
 * <br>1、同步代码块应该放在方法里；
 * <br>2、方法返回值应该紧靠在方法名前，除此之外synchronized关键字可以放在返回值前的任何位置！
 * <br>3、只有对象才能作为同步监视器！注意监视器的修饰符和方法的修饰符要兼容。
 * <br>4、同步方法或非同步方法里都可以放同步代码块，而且同步代码块还可以嵌套！
 * <br>5、经过其他地方测试发现普通同步方法的监视器为this，静态同步方法的监视器为 当前类名.class。
 * <br>6、因为普通方法和静态方法的监视器不同，因此两种方法不同步！
 * <br>7、同步代码块要用圆括号显式包围监视器，同步方法不用。
 *
 * @author 炜sama
 */
public class 同步代码块和方法的格式和synchronized的位置和监视器和同步嵌套 {
	byte b;
	boolean bl;
	char c;
	short s0;
	int i = 0;
	float f;
	double d;
	long l;
	String s;
	static int si;
	static String ss;

	//这几种同步代码块写法都有编译错误！
//	synchronized{}
//	synchronized(this){}
//	static synchronized(this){}
//	synchronized static(this){}

	//同步代码块应该放在方法里！
	public void name0() {
		synchronized (this) {
		}
	}

	public static void name1() {
		//在静态方法中同步代码块不能用this来做监视器！
		synchronized (同步代码块和方法的格式和synchronized的位置和监视器和同步嵌套.class) {
		}
	}

	//普通同步方法
	synchronized public void name2() {
	}

	public synchronized void name3() {
	}
//	public void synchronized name4() {	}//这种形式是错误的！

	//静态同步方法
	synchronized public static void name5() {
	}

	public synchronized static void name6() {
	}

	public static synchronized void name7() {
	}
//	public static void synchronized name8() {	}//这种形式是错误的！

	//经过测试发现Java的8种基本类型的变量都不可以作为监视器，只有引用类型对象才可以！
	//普通方法可以用普通对象或静态对象作为监视器
	public void m() {
		synchronized (s) {
		}
	}

	public void m0() {
		synchronized (ss) {
		}
	}

	//静态方法只能用静态变量！也可以用 类名.class！
//	public static void ms() {synchronized(s){}}//编译错误：不能对非静态字段 s 进行静态引用
	public static void ms0() {
		synchronized (ss) {
		}
	}

	//同步方法或非同步方法里都可以放同步代码块，而且同步代码块还可以嵌套！
	public synchronized void m1() {
		synchronized (s) {
			synchronized (s) {
				synchronized (s) {
					synchronized (s) {
						//...
					}
				}
			}
			synchronized (ss) {
				//......
			}
		}
	}
}
